//package com.kiki.favorite.controller;
//
//public class fd {
//    @Override
//    public List<Song> recommendSongs(int USERID) {
//        System.out.println("开始推荐");
//        // 通过播放历史来获取播放记录
//        if (historyMapper.getListByUserId(USERID) == 0) {
//            return null;
//        } else {
//            List<Long> userIdList = historyMapper.getAllUserId();
//            System.out.println("userIdList:"+userIdList);
//            System.out.println("播放历史的用户的用户人数有:"+userIdList.size());
//            int userIndex = userIdList.indexOf((long) USERID);
//            System.out.println("userIndex:"+userIndex);
//            int numUsers = userIdList.size();
//            List<HistoryData> historyDataList = new ArrayList<>();
//            for (Long userId1 : userIdList) {
//                HistoryData historyData = new HistoryData();
//                historyData.setUserId(userId1);
//                List<SongCount> songCountsList = historyMapper.getSongCountsByUserId(userId1);
//                historyData.setSongCounts(songCountsList);
//                historyDataList.add(historyData);
//            }
//            System.out.println("历史记录9:"+historyDataList);
//            if (historyDataList.size() == 0) {
//                return null;
//            }
//
//            int numItems = historyMapper.getNumItems();
//            System.out.println("numItems:"+numItems);
//            int[] songIdArray = historyMapper.getSongIdArray();
//            System.out.println("播放历史表中所有已播放歌曲id=>songIdArray:"+ Arrays.toString(songIdArray));
//
//            int[][] ratings = new int[numUsers][numItems];
//
//            for (int i = 0; i < numUsers; i++) {
//                HistoryData historyData = historyDataList.get(i);
//                System.out.println("获取矩阵用户为:"+historyData);
//                List<SongCount> songCountsList = historyData.getSongCounts();
//                System.out.println("列表:"+songCountsList);
//                for (SongCount songCount1 : songCountsList) {
//                    Long songId = songCount1.getSongId();
//                    System.out.println("SongCount对象为："+songCount1);//没问题
//                    for (int j = 0; j < songIdArray.length; j++) {
//                        if (songId.equals((long) songIdArray[j])) {
//                            Integer songCount = Math.toIntExact(songCount1.getCount());
//                            System.out.println("获取到的songCount："+songCount);
//                            ratings[i][j] = songCount;
//                        }
//                    }
//                }
//            }
//            System.out.println("矩阵打印：");
//            //循环打印出二维数组中的数据
//            for (int i = 0; i < numUsers; i++) {
//                for (int j = 0; j < numItems; j++) {
//                    System.out.print(ratings[i][j] + " ");
//                }
//                System.out.println();
//            }
//
//            // 计算用户相似度矩阵
//            double[][] similarityMatrix = new double[numUsers][numUsers];
//            for (int i = 0; i < numUsers; i++) {
//                for (int j = i + 1; j < numUsers; j++) {
//                    double similarity = calculateSimilarity(ratings[i], ratings[j], numItems);
//                    similarityMatrix[i][j] = similarity;
//                    similarityMatrix[j][i] = similarity;
//                }
//            }
//
//            double[] weightedSum = new double[numItems];
//            double[] similaritySum = new double[numItems];
//
//            for (int i = 0; i < numUsers; i++) {
//                if (i != userIndex) {
//                    for (int j = 0; j < numItems; j++) {
//                        if (ratings[userIndex][j] == 0 && ratings[i][j] != 0) {
//                            weightedSum[j] += ratings[i][j] * similarityMatrix[userIndex][i];
//                            similaritySum[j] += similarityMatrix[userIndex][i];
//                        }
//                    }
//                }
//            }
//
//            // 获取用户的音乐收藏和搜索历史
//            List<Long> favoriteSongIds = favoriteMapper.getFavoriteSongsByUserId(USERID);
//            List<Long> searchHistorySongIds = historyMapper.getSearchHistoryByUserId(USERID);
//
//            //打印出来音乐收藏和搜索历史列表数据
//            System.out.println("用户的音乐收藏：" + favoriteSongIds);
//            System.out.println("用户的搜索历史：" + searchHistorySongIds);
//
//
//            // 推荐歌曲列表
//            List<Song> songList = new ArrayList<>();
//            for (int i = 0; i < numItems; i++) {
//                System.out.println(ratings[userIndex][i]+"||"+similaritySum[i]);
//                if (ratings[userIndex][i] == 0 && similaritySum[i] != 0) {
//                    System.out.println("进入循环");
//                    double predictedRating = weightedSum[i] / similaritySum[i];
//                    Long songId = (long) songIdArray[i];
//                    if (favoriteSongIds.contains(songId)) {
//                        predictedRating += 1.0; // 增加权重
//                        System.out.println("收藏歌曲ID：" + songId + "，增加权重");
//                    }
//                    if (searchHistorySongIds.contains(songId)) {
//                        predictedRating += 0.5; // 增加权重
//                        System.out.println("搜索歌曲ID：" + songId + "，增加权重");
//                    }
//                    String songName = songMapper.getSongNameBySongId(songId);
//                    Song song = songMapper.selectSongBySongId(songId);
//                    System.out.println("获取的评分权重为："+predictedRating);
//                    songList.add(song);
//                    System.out.println(songName + "，预测播放可能性占成：" + predictedRating);
//                }
//            }
//            System.out.println("推荐结束");
//            return songList;
//        }
//    }
//
//    public static double calculateSimilarity(int[] user1, int[] user2, int numItems) {
//        double sum = 0.0;
//        int count = 0;
//        for (int i = 0; i < numItems; i++) {
//            if (user1[i] != 0 && user2[i] != 0) {
//                sum += Math.pow(user1[i] - user2[i], 2);
//                count++;
//            }
//        }
//        if (count == 0) {
//            return 0.0;
//        }
//        return 1.0 / (1.0 + Math.sqrt(sum));
//    }
//        }
